Análise Qualidade do Vinho
Análise Qualidade do Vinho
Inicio
Introdução
Trabalho de conlusão Matéria : CONCEITOS ESTATÍSTICOS PARA IA Professora: ADELAIDE ALVES DE OLIVEIRA
Integrantes do Grupo E2GR:
- EDUARDO MORAIS [ 334530 ]
- EDUARDO SIQUEIRA DE LIMA [ 334304 ]
- GABRIEL SHIKAMA [ 334068 ]
- RICARDO CALIMANIS [ 334759 ]
Análise realizada no dataset WineQuality onde aplicaremos todas as técnicas aprendidas em sala de aula.
Preparando o Ambiente
Instalando os pacotes necessários
Instalando os pacotes necessários para realizar as análises
#lista de pacotes que iremos utilizar no projeto
Pacotes_Necessarios <- c("ggplot2","readr","dplyr","corrplot","plotly","skimr","GGally","gmodels","ggpubr","caTools",
"caret" ,"rpart.plot","DT","e1071","corrgram")
#com base nos pacotes instalados crio uma variavel somente com os pacotes
#que não temos ainda para realizar a instalação
#dos pacotes que de fato não possuimos
PacotesNovos <- Pacotes_Necessarios[!(Pacotes_Necessarios %in% installed.packages()[,"Package"])]
if(length(PacotesNovos)){ install.packages(PacotesNovos)} else {print("Todos os Pacotes Estão Instalados")}[1] "Todos os Pacotes Estão Instalados"
Carregando os Pacotes
[[1]]
[1] TRUE
[[2]]
[1] TRUE
[[3]]
[1] TRUE
[[4]]
[1] TRUE
[[5]]
[1] TRUE
[[6]]
[1] TRUE
[[7]]
[1] TRUE
[[8]]
[1] TRUE
[[9]]
[1] TRUE
[[10]]
[1] TRUE
[[11]]
[1] TRUE
[[12]]
[1] TRUE
[[13]]
[1] TRUE
[[14]]
[1] TRUE
[[15]]
[1] TRUE
Dataset
Carregando o DataSet
A fim de facilitar a compreensão e desenvolvimento de nosso codigo decidimos mudar os nomes das colunas do data set, a tabela a baixo indica o nome original do arquivo e o nome que propuzemos
Lista DE - PARA das colunas
| Nome no Arquivo | Nome Traduzido |
|---|---|
| ID | ID (que não sera utilizado) |
| fixed acidity | acidez_fixa |
| volatile acidity | acidez_volatil |
| citric acid | acido_citrico |
| residual sugar | acucar_residual |
| chlorides | cloretos |
| free sulfur dioxide | fsd |
| total sulfur dioxide | tsd |
| density | densidade |
| pH | PH |
| sulphates | sulfatos |
| alcohol | grau_alcolico |
| quality | qualidade |
| Vinho | Tipo |
#Criando uma variável nome_colunas que receberá os nomes das colunas que normalizaremos a fim de facilitar o resto da análise
nome_colunas <- c("id","acidez_fixa","acidez_volatil","acido_citrico","acucar_residual","cloretos", "fsd", "tsd","densidade","PH",
"sulfatos","grau_alcolico","qualidade","tipo")
#uso da biblioteca readr é para obter uma performance de carga melhor que a lib padrão do R
#e escolhemos o read_csv2 justamente pelo fato do arquivo estar separado por ; ao invés de ,
#o separador decimal também não é o . que é convencional e este comando ja os converte facilmente
#skip = 1 para ignorar o cabecalho que mudamos para melhor entendimento
setwd("/mnt/hgfs/kal1s/files/cyberAI/Training/Fiap/MBA/Disciplinas/TrabalhosFiap/EstatisticaIA/Final")
vinhos <- read_csv2("Arquivos/BaseWine_Red_e_White.csv" ,col_names = nome_colunas, skip = 1)Análise Exploratória
Observando o DataFrame
Exibindo as Dimensões do dataframe vinhos
[1] 6497 14
Exibindo a Estrutura do dataframe vinhos
Classes 'spec_tbl_df', 'tbl_df', 'tbl' and 'data.frame': 6497 obs. of 14 variables:
$ id : num 1 2 3 4 5 6 7 8 9 10 ...
$ acidez_fixa : num 6.6 6.7 10.6 5.4 6.7 6.8 6.6 7.2 5.1 6.2 ...
$ acidez_volatil : num 0.24 0.34 0.31 0.18 0.3 0.5 0.61 0.66 0.26 0.22 ...
$ acido_citrico : num 0.35 0.43 0.49 0.24 0.44 0.11 0 0.33 0.33 0.2 ...
$ acucar_residual: num 7.7 1.6 2.2 4.8 18.8 ...
$ cloretos : num 0.031 0.041 0.063 0.041 0.057 0.075 0.069 0.068 0.027 0.035 ...
$ fsd : num 36 29 18 30 65 16 4 34 46 58 ...
$ tsd : num 135 114 40 113 224 49 8 102 113 184 ...
$ densidade : num 0.994 0.99 0.998 0.994 1 ...
$ PH : num 3.19 3.23 3.14 3.42 3.11 3.36 3.33 3.27 3.35 3.11 ...
$ sulfatos : num 0.37 0.44 0.51 0.4 0.53 0.79 0.37 0.78 0.43 0.53 ...
$ grau_alcolico : num 10.5 12.6 9.8 9.4 9.1 9.5 10.4 12.8 11.4 9 ...
$ qualidade : num 5 6 6 6 5 5 4 6 7 6 ...
$ tipo : chr "WHITE" "WHITE" "RED" "WHITE" ...
- attr(*, "spec")=
.. cols(
.. id = col_double(),
.. acidez_fixa = col_double(),
.. acidez_volatil = col_double(),
.. acido_citrico = col_double(),
.. acucar_residual = col_double(),
.. cloretos = col_double(),
.. fsd = col_double(),
.. tsd = col_double(),
.. densidade = col_double(),
.. PH = col_double(),
.. sulfatos = col_double(),
.. grau_alcolico = col_double(),
.. qualidade = col_double(),
.. tipo = col_character()
.. )
Validações Iniciais
Exibindo a Sumario e um histograma inicial do dataframe vinhos
options(width = 900) #definindo o tamanho da area de impressão de saida do markdown
options(max.print=500) # aumentando a saida da lista, sem esta opção alguns resultados tendem a ser cortados
skim(vinhos[, names(vinhos) != "id"] ) #retirando a coluna ID da análiseSkim summary statistics
n obs: 6497
n variables: 13
── Variable type:character ─────────────────────────────────────────────────────
variable missing complete n min max empty n_unique
tipo 0 6497 6497 3 5 0 2
── Variable type:numeric ───────────────────────────────────────────────────────
variable missing complete n mean sd p0 p25 p50 p75 p100 hist
acidez_fixa 0 6497 6497 7.22 1.3 3.8 6.4 7 7.7 15.9 ▁▇▇▂▁▁▁▁
acidez_volatil 0 6497 6497 0.34 0.16 0.08 0.23 0.29 0.4 1.58 ▇▇▂▁▁▁▁▁
acido_citrico 0 6497 6497 0.32 0.15 0 0.25 0.31 0.39 1.66 ▂▇▂▁▁▁▁▁
acucar_residual 0 6497 6497 5.44 4.73 0.6 1.8 3 8.1 45.8 ▇▂▂▁▁▁▁▁
cloretos 0 6497 6497 0.056 0.035 0.009 0.038 0.047 0.065 0.61 ▇▁▁▁▁▁▁▁
densidade 0 6497 6497 0.99 0.003 0.99 0.99 0.99 1 1.01 ▂▇▇▅▁▁▁▁
fsd 0 6497 6497 30.53 17.75 1 17 29 41 289 ▇▃▁▁▁▁▁▁
grau_alcolico 0 6497 6497 10.49 1.22 0.96 9.5 10.3 11.3 14.9 ▁▁▁▁▆▇▃▁
PH 0 6497 6497 3.22 0.16 2.72 3.11 3.21 3.32 4.01 ▁▃▇▇▃▁▁▁
qualidade 0 6497 6497 5.82 0.87 3 5 6 6 9 ▁▁▆▇▁▃▁▁
sulfatos 0 6497 6497 0.53 0.15 0.22 0.43 0.51 0.6 2 ▅▇▂▁▁▁▁▁
tsd 0 6497 6497 115.74 56.52 6 77 118 156 440 ▅▆▇▃▁▁▁▁
Observa-se que:
- O campo
acucar_residual,fsd,tsdpossuem um desvio padrão acima das demais variaveis - A maioria dos histogramas apresenta uma distribuição normal entretanto não centralizado o que pode indicar a presença de outliers
Checar presença de nulos
id acidez_fixa acidez_volatil acido_citrico acucar_residual cloretos fsd tsd densidade PH sulfatos grau_alcolico qualidade tipo
FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
O resultado acima nos descreve que não há presença de nulos na base, isto é indicado pelo retorno FALSE em cada variável
Checar presença de Registros Duplicados
Para prover melhor performance e acurácia de nossos modelos iremos verificar a existência de registros duplicados e removê-los se existir, mais antes é necessário remover uma coluna, ou simplesmente ignorar, que é a coluna ID que contem algum tipo de código incremental.
#removendo a coluna Id que não é necessária para nossa analise
vinhos<- vinhos[-1]
vinhos[duplicated(vinhos, fromLast = TRUE), ]# A tibble: 1,177 x 13
acidez_fixa acidez_volatil acido_citrico acucar_residual cloretos fsd tsd densidade PH sulfatos grau_alcolico qualidade tipo
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 6.6 0.24 0.35 7.7 0.031 36 135 0.994 3.19 0.37 10.5 5 WHITE
2 6.6 0.25 0.36 8.1 0.045 54 180 0.996 3.08 0.42 9.2 5 WHITE
3 7.2 0.63 0 1.9 0.097 14 38 0.997 3.37 0.580 9 6 RED
4 8.5 0.15 0.49 1.5 0.031 17 122 0.993 3.03 0.4 10.3 6 WHITE
5 6.6 0.19 0.43 10.9 0.045 53 154 0.998 3.52 0.77 10.4 6 WHITE
6 7.2 0.32 0.3 8.25 0.02 14 104 0.994 2.99 0.44 11.4 6 WHITE
7 6.4 0.45 0.07 1.1 0.03 10 131 0.990 2.97 0.28 10.8 5 WHITE
8 6.3 0.24 0.290 13.7 0.035 53 134 0.996 3.17 0.38 10.6 6 WHITE
9 11.1 0.31 0.53 2.2 0.06 3 10 0.996 3.02 0.83 10.9 7 RED
10 7 0.23 0.26 7.2 0.041 21 90 0.995 3.22 0.55 9.5 6 WHITE
# … with 1,167 more rows
De fato existem 1176 registros duplicados onde:
# A tibble: 2 x 2
tipo n
<chr> <int>
1 RED 240
2 WHITE 937
Removendo as linhas duplicadas
Histograma
Imprimindo Histogramas das variaveis
attach(vinhos)
Rotulos_Colunas <-c("acidez_fixa","acidez volatil" ,"acido citrico","acucar residual","cloretos","fsd","tsd","densidade",
"PH","sulfatos","grau alcolico","qualidade","tipo")
grafico_lista <- vector("list", length = length(Rotulos_Colunas)-2)
for(i in 2:13){
grafico_lista[[i-1]] <- plot_ly(x = as.formula(vinhos[i]), type = 'histogram', name = Rotulos_Colunas[i])
}
subplot(grafico_lista, nrows = 4)Podemos observar que quase em todas variáveis possuem um desenho ser similar à uma distribuição normal no entanto isso se deu pois mais à esquerda exceto grau alcoolico. Isso pode indicar presença de Outliers. A Conslusão que já se pode tirar é que há erros no Teor alcoolico, haja visto que é sabido que não existe vinhos com teor alcoolico a baixo de 8.
Explorando o DataSet
Nosso intuito nesta parte é entender se podemos considerar o dataset como um todo ou se devemos observá-los por tipo de vinho para isso iremos agregar os dados por tipo de vinho e ver como as variáveis se comportam
Group.1 acidez_fixa acidez_volatil acido_citrico acucar_residual cloretos fsd tsd densidade PH sulfatos grau_alcolico tipo
1 RED 1.7244751 0.1828621 0.1953835 1.352552 0.04936924 10.45414 33.42622 0.001859119 0.1535224 0.1707834 1.168107 NA
2 WHITE 0.8648942 0.1032085 0.1223250 4.808328 0.02314657 17.21688 43.11269 0.002830119 0.1514866 0.1135190 1.215335 NA
Nos parece que há algumas diferenças significativas levando em consideração, os desvios padrão agregado por tipo de vinho onde:
| Observações | |
|---|---|
| 1 | Acidez fixa é quase o dobro em vinhos Tintos |
| 2 | Acidez Volatil é maior 0.7 desvios em Tintos |
| 3 | Ácido Cítrico é quase 4 desvios maior em Brancos |
| 4 | Cloretos maior que 2 desvios em Tintos |
| 5 | Sulfatos (fsd e tsd) é Maior em Brancos |
| 6 | Densidade é maior em Brancos |
Entretanto a Qualidade não varia, ou seja em nossa perceção as características que determinam qualidade para os vinhos são diferentes e iremos ver a seguir a correlação dessas variáveis.
Preparação dos Dados
Inicio
Transformação de qualidade em variável categórica
Decidimos por classificar a nota da qualidade inicialmente em três grupos:
| Grupo | Notas |
|---|---|
| Ruim | 0 ~ 5.99 |
| Regular | 6 ~ 7.99 |
| Bom | >= 8 |
Neste caso, poderíamos utilizar algoritmos supervisionados como o K-means pra predizer em qual categoria um vinho se encontra.
Porém, consideramos que isso não faria sentido para rodar os modelos não supervisionados.
Para rodar este modelo, decidimos criar a variável GrupoQualidade, sendo qualquer qualidade com valor maior ou superior a 6 é classificado como vinho “BOM”. A variável GrupoQualidade será nossa variável dependente no caso.
vinhos$GrupoQualidade <- as.factor(ifelse(vinhos$qualidade > 6,1,0))
vinhos$GrupoQualidadeF <- as.factor(ifelse(vinhos$qualidade > 'Bom','Regular','Ruim'))Como Identificamos que pode fazer sentido analisar o vinho de maneira separada por tipo já que muitas variáveis tendem a se comportar de forma diferente vamos iniciar a preparação dos dados separando o dataset em 2 : df_base_tinto e df_base_branco
Transformação Box Cox
Em estatística, uma transformação de potência é uma família de funções que são aplicadas para criar a transformação monotônica de dados usando funções de potência. Esta é uma técnica de transformação de dados útil usada para estabilizar a variância, tornar os dados mais semelhantes à distribuição normal, melhorar a validade das medidas de associação (como a correlação de Pearson entre as variáveis) e para outros procedimentos de estabilização de dados.
Tanto a forma linear quanto a logarítmica são dois casos particulares de uma família mais extensa de transformações não-lineares. A transformação de potência é definida como uma função de variação contínua, em relação ao parâmetro de potência ?? (lambda), ou seja, x??. Uma classe geral de transformação que pode ser utilizada é a de Box-Cox, definida por:
para ?? diferente de 0 \[f_\lambda(x) = \frac{(x)^\lambda - 1}{\lambda} \]
para ?? = 0 \[f_0 = log(x)\]
Se a assimetria for 0, os dados são perfeitamente simétricos. Como regra geral: Se a assimetria for menor que -1 ou maior que 1, a distribuição é muito distorcida. Se a assimetria estiver entre -0,5 e 0,5, a distribuição é aproximadamente simétrica.
Usamos a transformação Boxcox e transformamos os dados e depois verificaremos a assimetria.
Vinho Tinto
Antes de transformar
acidez_fixa acidez_volatil acido_citrico acucar_residual cloretos fsd tsd densidade PH sulfatos grau_alcolico qualidade
0.91485260 0.73281550 0.31273584 4.54525487 5.50447109 1.22160470 1.53514979 0.02442147 0.18594471 2.40027683 -0.41917821 0.19029133
Transformado
#preparação para a transformação dos dados
df_prep_tinto <- preProcess(df_base_tinto[,1:12], c("BoxCox", "center", "scale"))
df_tinto <- data.frame(trans = predict(df_prep_tinto, df_base_tinto))
df_tinto trans.acidez_fixa trans.acidez_volatil trans.acido_citrico trans.acucar_residual trans.cloretos trans.fsd trans.tsd trans.densidade trans.PH trans.sulfatos trans.grau_alcolico trans.qualidade trans.tipo trans.GrupoQualidade trans.GrupoQualidadeF
1 1.29810397 -1.30627760 1.1128181 -0.001850401 -0.82713940 0.4996845 0.11714245 0.48189651 -1.11049223 -1.10481974 -0.54687971 0.4734439 RED 0 Ruim
2 -0.90674030 -0.04068574 -0.8320752 -1.770944466 -0.19322793 0.3275594 0.40235823 -0.67524163 0.35076797 1.00360974 -0.79972927 -0.7472466 RED 0 Ruim
3 -1.07715256 0.54161620 -1.3950707 -1.413132729 -0.48812008 -1.6983347 -2.14478317 -1.48157418 0.15723705 -3.44091800 -0.03188984 -2.0440277 RED 0 Ruim
4 -0.58885353 0.78209311 0.2939156 0.429376804 -0.54128582 1.4291018 1.43274060 -1.38397230 -0.23511109 0.95548972 2.14452807 0.4734439 RED 0 Ruim
5 -0.66563360 1.11995637 -0.5761682 -0.585096957 0.71805697 0.2332445 1.03758418 -0.05537573 -0.23511109 0.11482793 -0.96653593 -0.7472466 RED 0 Ruim
6 -1.25603319 -1.30627760 -0.9344380 -2.185373773 -0.65146465 0.2332445 -0.38413330 -1.14019941 0.73269923 0.51835513 -0.37657898 1.6342878 RED 1 Ruim
7 0.55286643 0.39063408 -0.1155356 -0.369266476 0.83055275 -0.6853877 -0.78844554 0.53017178 -0.23511109 0.63720916 -0.71579582 -0.7472466 RED 0 Ruim
8 -0.51376096 1.11995637 -1.3950707 -0.001850401 0.02510614 0.4996845 -0.38413330 0.50871772 0.66951162 -0.20144425 -0.88331005 -0.7472466 RED 0 Ruim
9 -0.90674030 0.33909336 -1.3950707 0.429376804 -0.33575840 1.3405065 0.77769185 -0.96705101 0.79570235 -0.56532142 0.67340363 0.4734439 RED 0 Ruim
10 -0.09550469 0.78209311 -1.3950707 -2.185373773 0.59812238 -1.1057987 -1.46244398 -0.54570095 0.79570235 -0.37679561 -0.79972927 -0.7472466 RED 0 Ruim
11 -0.74416367 -0.09792533 1.1128181 2.042197146 -1.01673184 1.0370678 1.67281014 0.37457133 0.22194040 0.85525644 0.05512239 -0.7472466 RED 0 Ruim
12 0.85556854 0.28691575 0.1915528 0.760103637 0.36775371 0.2332445 0.31356576 0.64276330 -1.31764793 1.52972247 -0.37657898 0.4734439 RED 0 Ruim
13 -0.66563360 1.03231257 -1.3950707 0.228898736 -0.38540000 0.7249562 0.34379086 -0.20610194 -0.10353414 -1.91937754 -0.88331005 -0.7472466 RED 0 Ruim
14 0.33248920 0.71132987 -0.1155356 -0.369266476 0.14591307 -0.6853877 -0.38413330 0.77670817 -0.16922232 -0.20144425 -0.37657898 0.4734439 RED 0 Ruim
15 -0.03070873 0.68748629 -0.2690798 0.298789583 0.53510993 -1.3722386 -0.15321959 -0.31384135 0.41489447 -0.37679561 0.49512800 -0.7472466 RED 0 Ruim
16 0.60552813 1.22719411 2.0852647 -1.101346266 3.49260072 0.4996845 0.77769185 -0.09842740 -2.82624749 2.49091477 -1.13191376 0.4734439 RED 0 Ruim
17 -1.07715256 0.78209311 -1.3950707 0.940494470 1.10712681 0.7249562 -0.24108654 -0.22225872 0.92115940 0.03971108 -0.11856806 -0.7472466 RED 0 Ruim
18 0.60552813 -1.81919259 0.3450970 -0.369266476 -0.38540000 1.8387277 0.84207319 0.53017178 0.85852205 1.30764683 -0.20491030 1.6342878 RED 1 Ruim
19 1.67848445 -0.52343785 1.3175437 1.166359316 0.85760115 1.3854754 1.37651657 2.29659343 -0.70205317 1.62973885 -1.04940460 -0.7472466 RED 0 Ruim
20 0.03280413 1.33199018 1.2663623 -0.369266476 1.26205563 1.5526717 2.00258670 0.10597572 -0.63472534 0.45621255 -0.96653593 -0.7472466 RED 0 Ruim
21 -0.16162642 0.96544681 -1.0879823 -0.585096957 -0.01678723 0.6536556 -0.07052436 -0.22764463 0.60613844 0.45621255 0.40647376 -0.7472466 RED 0 Ruim
22 0.60552813 0.87471384 -0.8320752 0.760103637 0.50279295 -0.2200077 0.25109265 1.16725178 0.02724537 -0.66498947 -0.79972927 0.4734439 RED 0 Ruim
23 -1.25603319 -0.92972053 -0.3202612 -0.001850401 -2.05372208 1.0370678 0.37337961 -0.04999500 1.04589127 0.90605649 -0.63151191 0.4734439 RED 0 Ruim
24 -1.54179892 -0.15598858 -0.9344380 -1.101346266 -0.05953776 0.4996845 -0.28716979 -1.44903433 0.92115940 -0.76853705 0.67340363 0.4734439 RED 0 Ruim
25 -0.51376096 -1.00195901 -0.1667170 -0.369266476 -0.59571744 1.1453673 0.37337961 -0.50793589 0.79570235 -0.76853705 -0.37657898 -2.0440277 RED 0 Ruim
26 0.44468133 -1.15088850 0.7033668 2.102183529 -0.28720784 -0.8805269 -1.46244398 -0.06613768 -0.03804531 -0.03795208 1.49126777 1.6342878 RED 1 Ruim
27 -0.16162642 1.22719411 -1.1903451 0.155658083 0.46991515 0.2332445 0.53891347 0.15972717 -0.30120165 0.18751981 -0.54687971 -0.7472466 RED 0 Ruim
28 -2.07169956 0.78209311 -1.3950707 0.429376804 -0.65146465 -0.8805269 -1.26132813 -2.24251338 1.35460259 -0.37679561 2.23904186 -0.7472466 RED 0 Ruim
29 2.48598925 -1.30627760 2.3923531 -0.827449926 -0.19322793 -1.1057987 -1.26132813 2.19035827 -3.12595443 1.00360974 -1.69920708 0.4734439 RED 0 Ruim
30 0.55286643 -0.27470530 0.1915528 0.760103637 0.50279295 0.5786969 1.37651657 0.77670817 0.09233910 0.03971108 -0.79972927 0.4734439 RED 0 Ruim
31 0.15614188 0.85173934 -0.0643542 -0.175936801 0.18464179 -0.2200077 0.21878287 0.48189651 0.02724537 -0.87619130 -1.04940460 -2.0440277 RED 0 Ruim
32 -3.39884588 0.07143227 -0.6273496 -0.175936801 -1.44558384 -0.6853877 0.79948164 -1.78556382 3.56674009 -0.56532142 2.42894867 -2.0440277 RED 0 Ruim
33 0.09507466 1.14160592 -0.9344380 -0.369266476 -0.59571744 -1.3722386 -1.83117423 -1.36229019 -0.16922232 -0.46932211 1.21584497 0.4734439 RED 0 Ruim
[ reached 'max' / getOption("max.print") -- omitted 1323 rows ]
#remove df desnecessario
rm("df_prep_tinto")
#atribui os nomes originais
colnames(df_tinto) <- colnames(df_base_tinto)
apply(df_tinto[1:12], 2, skewness, na.rm =TRUE) acidez_fixa acidez_volatil acido_citrico acucar_residual cloretos fsd tsd densidade PH sulfatos grau_alcolico qualidade
-0.008129168 -0.021898189 0.312735835 -0.069661390 -0.699341059 -0.221201247 -0.079340151 0.001059093 0.005566550 -0.008826281 0.329256703 0.027293765
Vinho Branco
Antes de transformar
acidez_fixa acidez_volatil acido_citrico acucar_residual cloretos fsd tsd densidade PH sulfatos grau_alcolico qualidade
0.7013495 1.6414430 1.3196543 1.0366612 4.9573952 1.5699091 0.4583929 0.4477260 0.4595307 0.9342072 0.4465706 0.1113035
Transformado
#preparação para a transformação dos dados
df_prep_branco <- preProcess(df_base_branco[,1:12], c("BoxCox", "center", "scale"))
df_branco <- data.frame(trans = predict(df_prep_branco, df_base_branco))
#atribui os nomes originais
colnames(df_branco) <- colnames(df_base_branco)
#remove df desnecessario
rm("df_prep_branco")
apply(df_branco[1:12], 2, skewness, na.rm =TRUE) acidez_fixa acidez_volatil acido_citrico acucar_residual cloretos fsd tsd densidade PH sulfatos grau_alcolico qualidade
0.11732154 0.16899788 1.31965427 -0.06001957 -0.14971492 0.09643235 0.01203796 0.42170951 -0.01219325 -0.02215590 0.03746823 0.11130348
Outliers
A maioria das estatísticas paramétricas, como médias, desvios-padrão e correlações, e todas as estatísticas com base nelas, são altamente sensíveis a outliers. As premissas dos procedimentos estatísticos comuns, como regressão linear e ANOVA, também são baseadas nessas estatísticas, quando outliers podem perturbar a estatística. análise. Assim, nós removemos os outliers.
Possivelmente, o passo mais importante na preparação de dados é identificar outliers. Como se trata de dados multivariados, consideramos apenas aqueles pontos que não possuem nenhum valor de variável de previsão para estar fora dos limites construídos pelos boxplots. A seguinte regra é aplicada:
Um valor preditivo é considerado um valor discrepante somente se for maior que 3 Desvios Padrão. A lógica por trás dessa regra é que os valores extremos extremos estão todos na extremidade superior dos valores e as distribuições são todas positivamente distorcidas.
Vinho Tinto
Identificando os Outliers
Iremos a seguir criar um dataframe somente para ter a quantidade de outliers identificados para cada variável, usaremos o comando abs para obter a posicão absoluta onde o desvio padrão é > 3 como ja fora transformado no passo anterior
outlier <- data.frame(matrix(ncol = 1, nrow = 1))
colnames(outlier)<-"tipo"
outlier$tipo = "Tinto"
outlier$acidez_fixa <- count(df_tinto[abs(df_tinto$acidez_fixa)>3,])
outlier$acidez_volatil <-count(df_tinto[abs(df_tinto$acidez_volatil)>3,])
outlier$acido_citrico <-count(df_tinto[abs(df_tinto$acido_citrico)>3,])
outlier$acucar_residual <-count(df_tinto[abs(df_tinto$acucar_residual)>3,])
outlier$cloretos <-count(df_tinto[abs(df_tinto$cloretos)>3,])
outlier$fsd <-count(df_tinto[abs(df_tinto$fsd)>3,])
outlier$tsd <-count(df_tinto[abs(df_tinto$tsd)>3,])
outlier$densidade <-count(df_tinto[abs(df_tinto$densidade)>3,])
outlier$PH <-count(df_tinto[abs(df_tinto$PH)>3,])
outlier$sulfatos <-count(df_tinto[abs(df_tinto$sulfatos)>3,])
outlier$grau_alcolico <-count(df_tinto[abs(df_tinto$grau_alcolico)>3,])
summary(outlier) tipo acidez_fixa.n acidez_volatil.n acido_citrico.n acucar_residual.n cloretos.n fsd.n tsd.n densidade.n PH.n sulfatos.n grau_alcolico.n
Length:1 Min. :2 Min. :4 Min. :1 Min. :7 Min. :25 Min. :2 Min. :0 Min. :12 Min. :7 Min. :6 Min. :10
Class :character 1st Qu.:2 1st Qu.:4 1st Qu.:1 1st Qu.:7 1st Qu.:25 1st Qu.:2 1st Qu.:0 1st Qu.:12 1st Qu.:7 1st Qu.:6 1st Qu.:10
Mode :character Median :2 Median :4 Median :1 Median :7 Median :25 Median :2 Median :0 Median :12 Median :7 Median :6 Median :10
Mean :2 Mean :4 Mean :1 Mean :7 Mean :25 Mean :2 Mean :0 Mean :12 Mean :7 Mean :6 Mean :10
3rd Qu.:2 3rd Qu.:4 3rd Qu.:1 3rd Qu.:7 3rd Qu.:25 3rd Qu.:2 3rd Qu.:0 3rd Qu.:12 3rd Qu.:7 3rd Qu.:6 3rd Qu.:10
Max. :2 Max. :4 Max. :1 Max. :7 Max. :25 Max. :2 Max. :0 Max. :12 Max. :7 Max. :6 Max. :10
Encontramos 67 observações e iremos remover de nossa análise
Removendo os outliers
df_tinto <- df_tinto[!abs(df_tinto$acidez_fixa)>3,]
df_tinto <- df_tinto[!abs(df_tinto$acidez_volatil)>3,]
df_tinto <- df_tinto[!abs(df_tinto$acido_citrico)>3,]
df_tinto <- df_tinto[!abs(df_tinto$acucar_residual)>3,]
df_tinto <- df_tinto[!abs(df_tinto$cloretos)>3,]
df_tinto <- df_tinto[!abs(df_tinto$fsd)>3,]
df_tinto <- df_tinto[!abs(df_tinto$densidade)>3,]
df_tinto <- df_tinto[!abs(df_tinto$PH)>3,]
df_tinto <- df_tinto[!abs(df_tinto$sulfatos)>3,]
df_tinto <- df_tinto[!abs(df_tinto$grau_alcolico)>3,]Validando o Dado
É possivel notar que após a remoção dos outliers os dados se encontram mais normalizados
Antes
attach(df_base_tinto)
Rotulos_Colunas <-c( "acidez_fixa","acidez volatil" ,"acido citrico","acucar residual","cloretos","fsd","tsd","densidade",
"PH","sulfatos","grau alcolico","qualidade")
p_1 <- vector("list", length = length(Rotulos_Colunas)-2)
for(i in 2:12){
p_1[[i-1]] <- plot_ly(x = as.formula(df_base_tinto[i]), type = 'histogram', name = Rotulos_Colunas[i])
}
subplot(p_1, nrows = 4)Vinho Branco
outlier <- data.frame(matrix(ncol = 1, nrow = 1))
colnames(outlier)<-"tipo"
outlier$tipo = "Branco"
outlier$acidez_fixa <- count(df_branco[abs(df_branco$acidez_fixa)>3,])
outlier$acidez_volatil <-count(df_branco[abs(df_branco$acidez_volatil)>3,])
outlier$acido_citrico <-count(df_branco[abs(df_branco$acido_citrico)>3,])
outlier$acucar_residual <-count(df_branco[abs(df_branco$acucar_residual)>3,])
outlier$cloretos <-count(df_branco[abs(df_branco$cloretos)>3,])
outlier$fsd <-count(df_branco[abs(df_branco$fsd)>3,])
outlier$tsd <-count(df_branco[abs(df_branco$tsd)>3,])
outlier$densidade <-count(df_branco[abs(df_branco$densidade)>3,])
outlier$PH <-count(df_branco[abs(df_branco$PH)>3,])
outlier$sulfatos <-count(df_branco[abs(df_branco$sulfatos)>3,])
outlier$grau_alcolico <-count(df_branco[abs(df_branco$grau_alcolico)>3,])
summary(outlier) tipo acidez_fixa.n acidez_volatil.n acido_citrico.n acucar_residual.n cloretos.n fsd.n tsd.n densidade.n PH.n sulfatos.n grau_alcolico.n
Length:1 Min. :20 Min. :18 Min. :70 Min. :0 Min. :80 Min. :13 Min. :23 Min. :5 Min. :17 Min. :10 Min. :0
Class :character 1st Qu.:20 1st Qu.:18 1st Qu.:70 1st Qu.:0 1st Qu.:80 1st Qu.:13 1st Qu.:23 1st Qu.:5 1st Qu.:17 1st Qu.:10 1st Qu.:0
Mode :character Median :20 Median :18 Median :70 Median :0 Median :80 Median :13 Median :23 Median :5 Median :17 Median :10 Median :0
Mean :20 Mean :18 Mean :70 Mean :0 Mean :80 Mean :13 Mean :23 Mean :5 Mean :17 Mean :10 Mean :0
3rd Qu.:20 3rd Qu.:18 3rd Qu.:70 3rd Qu.:0 3rd Qu.:80 3rd Qu.:13 3rd Qu.:23 3rd Qu.:5 3rd Qu.:17 3rd Qu.:10 3rd Qu.:0
Max. :20 Max. :18 Max. :70 Max. :0 Max. :80 Max. :13 Max. :23 Max. :5 Max. :17 Max. :10 Max. :0
Encontramos 153 observações fora do padrão e iremos remover de nossa análise
Removendo os outliers
df_branco <- df_branco[!abs(df_branco$acidez_fixa)>3,]
df_branco <- df_branco[!abs(df_branco$acidez_volatil)>3,]
df_branco <- df_branco[!abs(df_branco$acido_citrico)>3,]
df_branco <- df_branco[!abs(df_branco$cloretos)>3,]
df_branco <- df_branco[!abs(df_branco$fsd)>3,]
df_branco <- df_branco[!abs(df_branco$tsd)>3,]
df_branco <- df_branco[!abs(df_branco$densidade)>3,]
df_branco <- df_branco[!abs(df_branco$PH)>3,]
df_branco <- df_branco[!abs(df_branco$sulfatos)>3,]Validando o Dado
Assim como no vinho tinto, temos a mesma percepção de com poucas extrações o dado ficou também mais proximo do normal
Antes
attach(df_base_branco)
Rotulos_Colunas <-c("id", "acidez_fixa","acidez volatil" ,"acido citrico","acucar residual","cloretos","fsd","tsd","densidade",
"PH","sulfatos","grau alcolico","qualidade","tipo")
p_1 <- vector("list", length = length(Rotulos_Colunas)-2)
for(i in 2:11){
p_1[[i-1]] <- plot_ly(x = as.formula(df_base_branco[i]), type = 'histogram', name = Rotulos_Colunas[i])
}
subplot(p_1, nrows = 4)Matriz de Correlação
O primeiro passo para iniciar o processo de aplicação de modelos estatísticos é validar as correlações que possam indicar caracteristicas que determinam o fato.E neste caso precisamos saber quais das variáveis podem agregar qualidade ao vinho.
Regressão Linear
Teoria
Regressão linear é uma equação para se estimar a condicional (valor esperado) de uma variável y, dados os valores de algumas outras variáveis x.
Exemplo de regressão linear. A regressão, em geral, tem como objectivo tratar de um valor que não se consegue estimar inicialmente.
A regressão linear é chamada “linear” porque se considera que a relação da resposta às variáveis é uma função linear de alguns parâmetros. Os modelos de regressão que não são uma função linear dos parâmetros se chamam modelos de regressão não-linear. Sendo uma das primeiras formas de análise regressiva a ser estudada rigorosamente, e usada extensamente em aplicações práticas. Isso acontece porque modelos que dependem de forma linear dos seus parâmetros desconhecidos, são mais fáceis de ajustar que os modelos não-lineares aos seus parâmetros, e porque as propriedades estatísticas dos estimadores resultantes são fáceis de determinar.[1]
Formula
\[y_{i} = \alpha + \beta X_{i} + \varepsilon_{i}\]
onde:
\[y_{i}\]: Variável explicada (dependente); representa o que o modelo tentará prever \[\alpha\]: É uma constante, que representa a interceptação da reta com o eixo vertical; \[\beta\]: Representa a inclinação (coeficiente angular) em relação à variável explicativa; \[X_{i}\]: Variável explicativa (independente); \[\varepsilon _{i}}\]: Representa todos os factores residuais mais os possíveis erros de medição. O seu comportamento é aleatório, devido à natureza dos factores que encerra. Para que essa fórmula possa ser aplicada, os erros devem satisfazer determinadas hipóteses, que são: terem distribuição normal, com a mesma variância independentes e independentes da variável explicativa X, ou seja, i.i.d. (independentes e identicamente distribuídas).
Vinho Tinto
Separação dos Dados Treino e Teste
set.seed(1914) #seed relacionado ao ano de fundação do nosso amado e glorioso Palestra Itália
split <- sample.split(df_tinto$qualidade, SplitRatio = 0.8)
#dividindo o dataset para treino e teste
df_vinho_tinto_treino <- subset(df_tinto, split == TRUE)
df_vinho_tinto_teste <- subset(df_tinto, split == FALSE)Primeiro Modelo
Modelo_01 <- lm(qualidade~ acidez_fixa+acidez_volatil+acido_citrico+acucar_residual+cloretos+densidade+fsd+grau_alcolico+PH+sulfatos+tsd,
data = df_vinho_tinto_treino)
summary(Modelo_01)
Call:
lm(formula = qualidade ~ acidez_fixa + acidez_volatil + acido_citrico +
acucar_residual + cloretos + densidade + fsd + grau_alcolico +
PH + sulfatos + tsd, data = df_vinho_tinto_treino)
Residuals:
Min 1Q Median 3Q Max
-2.91779 -0.42534 -0.02276 0.54255 2.23170
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0005926 0.0240603 -0.025 0.9804
acidez_fixa 0.0989973 0.0644249 1.537 0.1247
acidez_volatil -0.2529691 0.0340139 -7.437 2.18e-13 ***
acido_citrico -0.0813844 0.0420323 -1.936 0.0531 .
acucar_residual 0.0337355 0.0340020 0.992 0.3214
cloretos -0.0292052 0.0330493 -0.884 0.3771
densidade -0.0807869 0.0650825 -1.241 0.2148
fsd 0.0604981 0.0432092 1.400 0.1618
grau_alcolico 0.3809766 0.0474714 8.025 2.77e-15 ***
PH -0.0952265 0.0457608 -2.081 0.0377 *
sulfatos 0.2302949 0.0296359 7.771 1.90e-14 ***
tsd -0.0877090 0.0452497 -1.938 0.0529 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.7686 on 1020 degrees of freedom
Multiple R-squared: 0.3984, Adjusted R-squared: 0.3919
F-statistic: 61.4 on 11 and 1020 DF, p-value: < 2.2e-16
Vinho Branco
Separação dos Dados Treino e Teste
set.seed(1914) #seed relacionado ao ano de fundação do nosso amado e glorioso Palestra Itália
split <- sample.split(df_branco$qualidade, SplitRatio = 0.8)
#dividindo o dataset para treino e teste
df_vinho_branco_treino <- subset(df_branco, split == TRUE)
df_vinho_branco_teste <- subset(df_branco, split == FALSE)Primeiro Modelo
Modelo_01 <- lm(qualidade~ acidez_fixa+acidez_volatil+acido_citrico+acucar_residual+cloretos+densidade+fsd+grau_alcolico+PH+sulfatos+tsd,
data = df_vinho_branco_treino)
summary(Modelo_01)
Call:
lm(formula = qualidade ~ acidez_fixa + acidez_volatil + acido_citrico +
acucar_residual + cloretos + densidade + fsd + grau_alcolico +
PH + sulfatos + tsd, data = df_vinho_branco_treino)
Residuals:
Min 1Q Median 3Q Max
-3.7158 -0.5311 -0.0277 0.5226 3.4384
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.008325 0.015059 0.553 0.58045
acidez_fixa 0.068133 0.023397 2.912 0.00362 **
acidez_volatil -0.150709 0.016759 -8.993 < 2e-16 ***
acido_citrico 0.053721 0.018986 2.829 0.00469 **
acucar_residual 0.344473 0.036732 9.378 < 2e-16 ***
cloretos -0.109751 0.020807 -5.275 1.43e-07 ***
densidade -0.440484 0.061300 -7.186 8.43e-13 ***
fsd 0.186139 0.021158 8.797 < 2e-16 ***
grau_alcolico 0.212618 0.039284 5.412 6.72e-08 ***
PH 0.138252 0.020761 6.659 3.27e-11 ***
sulfatos 0.080651 0.016046 5.026 5.30e-07 ***
tsd -0.062914 0.024020 -2.619 0.00886 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.8166 on 2954 degrees of freedom
Multiple R-squared: 0.3135, Adjusted R-squared: 0.3109
F-statistic: 122.6 on 11 and 2954 DF, p-value: < 2.2e-16
Árvore de Regressão
Técnica
É muito similar a árvore de decisão, pois segue a mesma ideia: um conjunto de nós de DECISÃO/PERGUNTAS partindo de exemplos.
A única diferença é que a resposta é um número ao invés de uma categoria.
A obtenção de árvores de regressão usando o R é feita por meio da função rpart, tal como nas árvores de decisão.
Vinho Tinto
RT_Modelo_01 <- rpart(qualidade ~ acidez_fixa+acidez_volatil+acido_citrico+acucar_residual+cloretos+densidade+fsd+grau_alcolico+PH+sulfatos+tsd, data = df_vinho_tinto_treino)
summary(RT_Modelo_01)Call:
rpart(formula = qualidade ~ acidez_fixa + acidez_volatil + acido_citrico +
acucar_residual + cloretos + densidade + fsd + grau_alcolico +
PH + sulfatos + tsd, data = df_vinho_tinto_treino)
n= 1032
CP nsplit rel error xerror xstd
1 0.18965507 0 1.0000000 1.0010049 0.04793595
2 0.06016577 1 0.8103449 0.8410342 0.04473512
3 0.03987222 2 0.7501792 0.8079763 0.04148181
4 0.03328510 3 0.7103069 0.8159455 0.04190225
5 0.02331796 4 0.6770218 0.7696630 0.03910886
6 0.02114413 5 0.6537039 0.7561527 0.03786086
7 0.01996104 6 0.6325598 0.7528794 0.03825171
8 0.01130783 7 0.6125987 0.7274491 0.03750090
9 0.01087334 8 0.6012909 0.7378201 0.03763991
10 0.01046919 9 0.5904175 0.7283979 0.03759222
11 0.01016485 10 0.5799484 0.7233240 0.03756813
12 0.01000000 11 0.5697835 0.7262831 0.03763340
Variable importance
grau_alcolico sulfatos densidade acidez_volatil tsd acido_citrico acidez_fixa PH cloretos fsd acucar_residual
33 15 11 10 8 6 6 5 4 2 1
Node number 1: 1032 observations, complexity param=0.1896551
mean=0.002004876, MSE=0.9705261
left son=2 (766 obs) right son=3 (266 obs)
Primary splits:
grau_alcolico < 0.5396166 to the left, improve=0.18965510, (0 missing)
sulfatos < 0.1511739 to the left, improve=0.14816780, (0 missing)
acidez_volatil < 0.220747 to the right, improve=0.13010950, (0 missing)
acido_citrico < 0.1147807 to the left, improve=0.09954917, (0 missing)
densidade < -0.6131584 to the right, improve=0.06713087, (0 missing)
Surrogate splits:
densidade < -0.6779414 to the right, agree=0.833, adj=0.353, (0 split)
cloretos < -1.186951 to the right, agree=0.763, adj=0.079, (0 split)
acidez_fixa < -2.015744 to the right, agree=0.753, adj=0.041, (0 split)
acido_citrico < 1.854948 to the left, agree=0.749, adj=0.026, (0 split)
PH < 1.568081 to the left, agree=0.747, adj=0.019, (0 split)
Node number 2: 766 observations, complexity param=0.06016577
mean=-0.2508156, MSE=0.7437246
left son=4 (492 obs) right son=5 (274 obs)
Primary splits:
sulfatos < 0.1511739 to the left, improve=0.10577800, (0 missing)
acidez_volatil < -0.9119238 to the right, improve=0.10047880, (0 missing)
grau_alcolico < -0.397931 to the left, improve=0.07528245, (0 missing)
acido_citrico < 0.01241791 to the left, improve=0.05165566, (0 missing)
tsd < 1.151455 to the right, improve=0.04508008, (0 missing)
Surrogate splits:
acidez_volatil < -0.7552291 to the right, agree=0.698, adj=0.157, (0 split)
acido_citrico < 0.6265947 to the left, agree=0.693, adj=0.142, (0 split)
acidez_fixa < 1.193824 to the left, agree=0.685, adj=0.120, (0 split)
grau_alcolico < 0.12061 to the left, agree=0.680, adj=0.106, (0 split)
densidade < 0.8837916 to the left, agree=0.663, adj=0.058, (0 split)
Node number 3: 266 observations, complexity param=0.03987222
mean=0.7300519, MSE=0.9095286
left son=6 (110 obs) right son=7 (156 obs)
Primary splits:
sulfatos < 0.07726951 to the left, improve=0.1650667, (0 missing)
acido_citrico < 0.1147807 to the left, improve=0.1448919, (0 missing)
PH < 0.3828312 to the right, improve=0.1232959, (0 missing)
acidez_fixa < -0.7048986 to the left, improve=0.1113672, (0 missing)
acidez_volatil < 0.3648637 to the right, improve=0.1021026, (0 missing)
Surrogate splits:
acidez_fixa < -0.6272436 to the left, agree=0.673, adj=0.209, (0 split)
acido_citrico < 0.06359931 to the left, agree=0.662, adj=0.182, (0 split)
PH < 0.7642008 to the right, agree=0.658, adj=0.173, (0 split)
tsd < -1.410368 to the left, agree=0.650, adj=0.155, (0 split)
densidade < -1.321643 to the left, agree=0.643, adj=0.136, (0 split)
Node number 4: 492 observations, complexity param=0.01996104
mean=-0.4601288, MSE=0.6152957
left son=8 (26 obs) right son=9 (466 obs)
Primary splits:
acidez_volatil < 1.66197 to the right, improve=0.06604212, (0 missing)
sulfatos < -0.4230589 to the left, improve=0.04278913, (0 missing)
tsd < -1.30981 to the left, improve=0.03373064, (0 missing)
grau_alcolico < -0.397931 to the left, improve=0.02542169, (0 missing)
fsd < -0.7829573 to the left, improve=0.02039282, (0 missing)
Node number 5: 274 observations, complexity param=0.0332851
mean=0.1250314, MSE=0.7544035
left son=10 (35 obs) right son=11 (239 obs)
Primary splits:
tsd < 1.134522 to the right, improve=0.16128080, (0 missing)
acidez_volatil < -0.9119238 to the right, improve=0.15608930, (0 missing)
grau_alcolico < -0.4192402 to the left, improve=0.11918110, (0 missing)
cloretos < 0.6134846 to the right, improve=0.08898052, (0 missing)
acidez_fixa < 0.5791973 to the left, improve=0.06934507, (0 missing)
Surrogate splits:
acucar_residual < 2.12965 to the right, agree=0.880, adj=0.057, (0 split)
fsd < 1.870502 to the right, agree=0.876, adj=0.029, (0 split)
Node number 6: 110 observations, complexity param=0.02114413
mean=0.268624, MSE=0.9403877
left son=12 (58 obs) right son=13 (52 obs)
Primary splits:
PH < 0.3828312 to the right, improve=0.20472790, (0 missing)
acidez_volatil < -0.06930554 to the right, improve=0.20256360, (0 missing)
acido_citrico < 0.1659621 to the left, improve=0.17148800, (0 missing)
acidez_fixa < -0.7048986 to the left, improve=0.15974650, (0 missing)
grau_alcolico < 0.9884923 to the left, improve=0.05209789, (0 missing)
Surrogate splits:
acidez_fixa < -0.4770287 to the left, agree=0.882, adj=0.750, (0 split)
acido_citrico < -0.0387635 to the left, agree=0.882, adj=0.750, (0 split)
acidez_volatil < -0.4915943 to the right, agree=0.809, adj=0.596, (0 split)
fsd < -0.4362771 to the right, agree=0.664, adj=0.288, (0 split)
cloretos < -0.7378493 to the left, agree=0.655, adj=0.269, (0 split)
Node number 7: 156 observations, complexity param=0.01016485
mean=1.055418, MSE=0.6317732
left son=14 (56 obs) right son=15 (100 obs)
Primary splits:
grau_alcolico < 0.9884923 to the left, improve=0.10330040, (0 missing)
fsd < 0.5391907 to the right, improve=0.08807679, (0 missing)
tsd < 0.06330731 to the right, improve=0.07717586, (0 missing)
densidade < -1.812733 to the right, improve=0.04707774, (0 missing)
acidez_volatil < -0.3662575 to the right, improve=0.03931849, (0 missing)
Surrogate splits:
acidez_volatil < -2.372357 to the left, agree=0.654, adj=0.036, (0 split)
acido_citrico < 0.1659621 to the left, agree=0.654, adj=0.036, (0 split)
PH < -0.8713243 to the left, agree=0.654, adj=0.036, (0 split)
fsd < 1.572158 to the right, agree=0.647, adj=0.018, (0 split)
tsd < 1.315958 to the right, agree=0.647, adj=0.018, (0 split)
Node number 8: 26 observations
mean=-1.313541, MSE=1.085255
Node number 9: 466 observations, complexity param=0.01130783
mean=-0.4125135, MSE=0.5461722
left son=18 (300 obs) right son=19 (166 obs)
Primary splits:
grau_alcolico < -0.397931 to the left, improve=0.04449903, (0 missing)
sulfatos < -0.4230589 to the left, improve=0.03467342, (0 missing)
acidez_volatil < 0.746838 to the right, improve=0.02965481, (0 missing)
tsd < -1.30981 to the left, improve=0.02423048, (0 missing)
PH < 1.44634 to the right, improve=0.01583774, (0 missing)
Surrogate splits:
densidade < -0.6671426 to the right, agree=0.680, adj=0.102, (0 split)
cloretos < -0.514703 to the right, agree=0.663, adj=0.054, (0 split)
tsd < -1.905212 to the right, agree=0.661, adj=0.048, (0 split)
acidez_fixa < -1.492943 to the right, agree=0.657, adj=0.036, (0 split)
acidez_volatil < -1.113273 to the right, agree=0.652, adj=0.024, (0 split)
Node number 10: 35 observations
mean=-0.7864715, MSE=0.1371291
Node number 11: 239 observations, complexity param=0.02331796
mean=0.2585151, MSE=0.7053107
left son=22 (173 obs) right son=23 (66 obs)
Primary splits:
acidez_volatil < -0.9658398 to the right, improve=0.13854760, (0 missing)
grau_alcolico < -0.4192402 to the left, improve=0.10157690, (0 missing)
acido_citrico < -1.062392 to the left, improve=0.09335675, (0 missing)
PH < 1.07694 to the right, improve=0.08085371, (0 missing)
cloretos < 0.6285956 to the right, improve=0.06499344, (0 missing)
Surrogate splits:
acido_citrico < 0.8313204 to the left, agree=0.774, adj=0.182, (0 split)
cloretos < -0.8579218 to the right, agree=0.745, adj=0.076, (0 split)
fsd < 1.770708 to the left, agree=0.741, adj=0.061, (0 split)
PH < -2.202895 to the right, agree=0.736, adj=0.045, (0 split)
tsd < -1.764199 to the right, agree=0.736, adj=0.045, (0 split)
Node number 12: 58 observations
mean=-0.1468364, MSE=0.8054716
Node number 13: 52 observations
mean=0.7320222, MSE=0.6836096
Node number 14: 56 observations
mean=0.7140381, MSE=0.6231425
Node number 15: 100 observations
mean=1.24659, MSE=0.534797
Node number 18: 300 observations
mean=-0.5284803, MSE=0.4319252
Node number 19: 166 observations, complexity param=0.01087334
mean=-0.2029351, MSE=0.6844154
left son=38 (24 obs) right son=39 (142 obs)
Primary splits:
tsd < -1.30981 to the left, improve=0.09585663, (0 missing)
fsd < -0.7829573 to the left, improve=0.07165548, (0 missing)
densidade < 0.7954522 to the left, improve=0.06646794, (0 missing)
sulfatos < -0.3321776 to the left, improve=0.04341652, (0 missing)
PH < 1.38521 to the right, improve=0.03526601, (0 missing)
Surrogate splits:
fsd < -1.302597 to the left, agree=0.904, adj=0.333, (0 split)
cloretos < -1.117557 to the left, agree=0.886, adj=0.208, (0 split)
sulfatos < -2.33142 to the left, agree=0.867, adj=0.083, (0 split)
acucar_residual < -1.978159 to the left, agree=0.861, adj=0.042, (0 split)
PH < 1.749415 to the right, agree=0.861, adj=0.042, (0 split)
Node number 22: 173 observations, complexity param=0.01046919
mean=0.06543446, MSE=0.595937
left son=44 (83 obs) right son=45 (90 obs)
Primary splits:
grau_alcolico < -0.4192402 to the left, improve=0.10170760, (0 missing)
acidez_volatil < 0.220747 to the right, improve=0.07798942, (0 missing)
acido_citrico < -1.164754 to the left, improve=0.07776564, (0 missing)
PH < 0.8271122 to the right, improve=0.06725018, (0 missing)
cloretos < 1.25143 to the right, improve=0.05525110, (0 missing)
Surrogate splits:
acido_citrico < -0.0387635 to the left, agree=0.647, adj=0.265, (0 split)
acidez_fixa < 0.3607951 to the left, agree=0.630, adj=0.229, (0 split)
acidez_volatil < 0.3130046 to the right, agree=0.618, adj=0.205, (0 split)
densidade < -0.122649 to the right, agree=0.613, adj=0.193, (0 split)
acucar_residual < 0.3640832 to the left, agree=0.595, adj=0.157, (0 split)
Node number 23: 66 observations
mean=0.7646204, MSE=0.6381406
Node number 38: 24 observations
mean=-0.8259659, MSE=1.101106
Node number 39: 142 observations
mean=-0.0976341, MSE=0.5372948
Node number 44: 83 observations
mean=-0.1909308, MSE=0.4815758
Node number 45: 90 observations
mean=0.3018602, MSE=0.5848951
O Modelo apresentado acima teve um desepenho melhor que Regressão Linear Observamos que a variavel Grau Alcoolico é a variavel que possui o maior peso pois ela está no node mais alto da arvore.
Análise da Qualidade do Modelo (Matriz de Confusão)
RT_preditor <- predict(RT_Modelo_01, newdata = df_vinho_tinto_teste)
RT_Valores_Corte <- as.factor(ifelse(RT_preditor > 6,1,0))
confusionMatrix(RT_Valores_Corte, df_vinho_tinto_teste$GrupoQualidade)Confusion Matrix and Statistics
Reference
Prediction 0 1
0 224 35
1 0 0
Accuracy : 0.8649
95% CI : (0.8171, 0.904)
No Information Rate : 0.8649
P-Value [Acc > NIR] : 0.5449
Kappa : 0
Mcnemar's Test P-Value : 9.081e-09
Sensitivity : 1.0000
Specificity : 0.0000
Pos Pred Value : 0.8649
Neg Pred Value : NaN
Prevalence : 0.8649
Detection Rate : 0.8649
Detection Prevalence : 1.0000
Balanced Accuracy : 0.5000
'Positive' Class : 0
86% de acertividade
Vinho Branco
RT_Modelo_01 <- rpart(qualidade ~ acidez_fixa+acidez_volatil+acido_citrico+acucar_residual+cloretos+densidade+fsd+grau_alcolico+PH+sulfatos+tsd, data = df_vinho_branco_treino)
summary(RT_Modelo_01)Call:
rpart(formula = qualidade ~ acidez_fixa + acidez_volatil + acido_citrico +
acucar_residual + cloretos + densidade + fsd + grau_alcolico +
PH + sulfatos + tsd, data = df_vinho_branco_treino)
n= 2966
CP nsplit rel error xerror xstd
1 0.17619501 0 1.0000000 1.0007017 0.02704089
2 0.04145691 1 0.8238050 0.8253886 0.02465195
3 0.02600484 2 0.7823481 0.7844375 0.02429231
4 0.01758769 3 0.7563432 0.7659587 0.02353418
5 0.01228332 4 0.7387555 0.7575937 0.02327931
6 0.01000000 5 0.7264722 0.7399149 0.02261242
Variable importance
grau_alcolico densidade cloretos tsd acidez_volatil fsd acucar_residual sulfatos acido_citrico PH
36 23 12 8 8 5 5 1 1 1
Node number 1: 2966 observations, complexity param=0.176195
mean=0.02317861, MSE=0.9674341
left son=2 (1800 obs) right son=3 (1166 obs)
Primary splits:
grau_alcolico < 0.3424558 to the left, improve=0.17619500, (0 missing)
densidade < -0.6974774 to the right, improve=0.12381530, (0 missing)
cloretos < -0.01120033 to the right, improve=0.09321832, (0 missing)
tsd < 0.5387351 to the right, improve=0.04655035, (0 missing)
acido_citrico < -0.8149336 to the left, improve=0.03543393, (0 missing)
Surrogate splits:
densidade < -0.6316146 to the right, agree=0.863, adj=0.653, (0 split)
cloretos < -0.2502617 to the right, agree=0.741, adj=0.342, (0 split)
tsd < -0.4792879 to the right, agree=0.681, adj=0.189, (0 split)
acucar_residual < 0.2869475 to the right, agree=0.662, adj=0.140, (0 split)
sulfatos < -1.098038 to the right, agree=0.620, adj=0.034, (0 split)
Node number 2: 1800 observations, complexity param=0.04145691
mean=-0.3091139, MSE=0.706894
left son=4 (949 obs) right son=5 (851 obs)
Primary splits:
acidez_volatil < -0.07404229 to the right, improve=0.09348947, (0 missing)
fsd < -1.413899 to the left, improve=0.04482435, (0 missing)
grau_alcolico < -0.2856169 to the left, improve=0.04101271, (0 missing)
cloretos < 0.5163293 to the right, improve=0.03254169, (0 missing)
PH < 0.8886209 to the left, improve=0.03244542, (0 missing)
Surrogate splits:
tsd < 0.5604489 to the right, agree=0.612, adj=0.179, (0 split)
acido_citrico < -0.5696854 to the left, agree=0.581, adj=0.113, (0 split)
grau_alcolico < -0.3482213 to the left, agree=0.577, adj=0.105, (0 split)
densidade < 0.1770835 to the right, agree=0.576, adj=0.103, (0 split)
PH < 0.7082788 to the left, agree=0.570, adj=0.090, (0 split)
Node number 3: 1166 observations, complexity param=0.02600484
mean=0.5361516, MSE=0.9360418
left son=6 (608 obs) right son=7 (558 obs)
Primary splits:
grau_alcolico < 1.073028 to the left, improve=0.06836801, (0 missing)
fsd < -1.608991 to the left, improve=0.05935855, (0 missing)
acucar_residual < -1.318872 to the left, improve=0.02510477, (0 missing)
densidade < -0.9024215 to the right, improve=0.02276161, (0 missing)
tsd < -1.763242 to the left, improve=0.02232176, (0 missing)
Surrogate splits:
densidade < -1.059489 to the right, agree=0.725, adj=0.425, (0 split)
acidez_volatil < 0.03761714 to the left, agree=0.635, adj=0.237, (0 split)
cloretos < -0.519033 to the right, agree=0.633, adj=0.233, (0 split)
acucar_residual < -1.114568 to the left, agree=0.551, adj=0.063, (0 split)
tsd < -0.1643378 to the right, agree=0.551, adj=0.063, (0 split)
Node number 4: 949 observations, complexity param=0.01228332
mean=-0.5525529, MSE=0.6252677
left son=8 (135 obs) right son=9 (814 obs)
Primary splits:
fsd < -1.063122 to the left, improve=0.05939858, (0 missing)
cloretos < 0.5163293 to the right, improve=0.04192878, (0 missing)
PH < 0.9476561 to the left, improve=0.02471973, (0 missing)
acidez_volatil < 0.3491317 to the right, improve=0.02443427, (0 missing)
grau_alcolico < -0.1639063 to the left, improve=0.02399822, (0 missing)
Surrogate splits:
tsd < -0.8873303 to the left, agree=0.887, adj=0.207, (0 split)
densidade < -0.9613 to the left, agree=0.862, adj=0.030, (0 split)
acidez_fixa < 2.86523 to the right, agree=0.861, adj=0.022, (0 split)
acucar_residual < -1.59975 to the left, agree=0.860, adj=0.015, (0 split)
PH < -2.257615 to the left, agree=0.859, adj=0.007, (0 split)
Node number 5: 851 observations
mean=-0.03764077, MSE=0.6581355
Node number 6: 608 observations, complexity param=0.01758769
mean=0.2938036, MSE=0.9043135
left son=12 (43 obs) right son=13 (565 obs)
Primary splits:
fsd < -1.608991 to the left, improve=0.09178650, (0 missing)
acido_citrico < -0.8149336 to the left, improve=0.03930066, (0 missing)
acidez_volatil < 1.657868 to the right, improve=0.03153874, (0 missing)
tsd < -1.553351 to the left, improve=0.02545143, (0 missing)
acidez_fixa < 0.3004013 to the right, improve=0.02138791, (0 missing)
Surrogate splits:
tsd < -2.452791 to the left, agree=0.941, adj=0.163, (0 split)
Node number 7: 558 observations
mean=0.8002153, MSE=0.8368882
Node number 8: 135 observations
mean=-1.025776, MSE=0.6297488
Node number 9: 814 observations
mean=-0.4740699, MSE=0.5812249
Node number 12: 43 observations
mean=-0.7505292, MSE=1.244715
Node number 13: 565 observations
mean=0.3732838, MSE=0.789086
Nota se que para determinar a qualidade do vinho branco utiliza-se menos variáveis que para vinho tinto
RT_preditor <- predict(RT_Modelo_01, newdata = df_vinho_branco_teste)
RT_Valores_Corte <- as.factor(ifelse(RT_preditor > 6,1,0))
confusionMatrix(RT_Valores_Corte, df_vinho_branco_teste$GrupoQualidade)Confusion Matrix and Statistics
Reference
Prediction 0 1
0 583 159
1 0 0
Accuracy : 0.7857
95% CI : (0.7544, 0.8147)
No Information Rate : 0.7857
P-Value [Acc > NIR] : 0.5212
Kappa : 0
Mcnemar's Test P-Value : <2e-16
Sensitivity : 1.0000
Specificity : 0.0000
Pos Pred Value : 0.7857
Neg Pred Value : NaN
Prevalence : 0.7857
Detection Rate : 0.7857
Detection Prevalence : 1.0000
Balanced Accuracy : 0.5000
'Positive' Class : 0
Para vinho branco temos uma acurácia de 78%
Árvore de Decisão
Técnica
É muito utilizada para aprendizagem indutiva e é extremamente prática.
O conhecimento da Árvore de Decisão será baseado em uma estrutura de árvore para assim podermos realizar decisão. Porém, caso não queira representar em estruturá de árvores, pode ser facilmente representada por regras “se/então”. Pode-se utilizar tanto em problemas supervisionados quanto não supervisionados.
A árvore decisão também consegue descobrir quais são os atributos de maior importância para predição formando uma estrutura de nós.
A base é a mesma da árvore de regressão.
Classe de algoritmos de aprendizado baseado na árvore de decisão: ID3(“top-down”), C4.5 etc.
É importante ressaltar que uanto menor a árvore, melhor será a indução. Isso basicamente quer dizer que: caso fique grande, pode cair num problema de overfitting (“100% de acerto”).
Outra coisa que precisa-se lembrar em uma Árvore de Decisão é a entropia, a qual diz o quanto um conjunto de dados aleatório está “impuro”. E sempre varia entre 0 e 1, de acordo com a proporção de +/- no conjunto. Vale lembrar que a entropia é importante para o cálculo de ganho de informação para a árvore.
A entropia (binária) é dada pela seguinte fórmula:
\[Entropia(S) = -\sum p_{+} log_{2} p_{+} - p_{-} log_{2} p_{-}\]
onde:
S: coleção S contendo exemplos p(+): proporção de exemplos positivos em S; p(-): proporção de exemplos negativos em S
Referencia: http://web.tecnico.ulisboa.pt/ana.freitas/bioinformatics.ath.cx/bioinformatics.ath.cx/indexf23d.html?id=199
Vinho Tinto
DT_Modelo01 <-rpart(GrupoQualidade ~ acidez_fixa+acidez_volatil+acido_citrico+acucar_residual+cloretos+densidade+fsd+grau_alcolico+PH+sulfatos+tsd, data = df_vinho_tinto_treino)
summary(DT_Modelo01)Call:
rpart(formula = GrupoQualidade ~ acidez_fixa + acidez_volatil +
acido_citrico + acucar_residual + cloretos + densidade +
fsd + grau_alcolico + PH + sulfatos + tsd, data = df_vinho_tinto_treino)
n= 1032
CP nsplit rel error xerror xstd
1 0.10071942 0 1.0000000 1.0000000 0.07890027
2 0.05035971 2 0.7985612 0.8489209 0.07354607
3 0.02158273 3 0.7482014 0.8345324 0.07299987
4 0.01918465 5 0.7050360 0.8920863 0.07514483
5 0.01438849 8 0.6474820 0.9352518 0.07668674
6 0.01000000 9 0.6330935 0.9424460 0.07693844
Variable importance
grau_alcolico densidade sulfatos acidez_volatil fsd tsd PH acido_citrico acidez_fixa cloretos
30 11 9 8 8 8 8 7 7 2
Node number 1: 1032 observations, complexity param=0.1007194
predicted class=0 expected loss=0.1346899 P(node) =1
class counts: 893 139
probabilities: 0.865 0.135
left son=2 (868 obs) right son=3 (164 obs)
Primary splits:
grau_alcolico < 0.9884923 to the left, improve=42.14039, (0 missing)
sulfatos < 0.424181 to the left, improve=26.51461, (0 missing)
acidez_volatil < -0.7552291 to the right, improve=24.87296, (0 missing)
acido_citrico < 0.2171435 to the left, improve=19.98735, (0 missing)
densidade < -0.7535512 to the right, improve=13.72150, (0 missing)
Surrogate splits:
densidade < -1.35958 to the right, agree=0.875, adj=0.213, (0 split)
acidez_fixa < -2.188553 to the right, agree=0.847, adj=0.037, (0 split)
cloretos < -1.912024 to the right, agree=0.844, adj=0.018, (0 split)
PH < 2.806385 to the left, agree=0.843, adj=0.012, (0 split)
tsd < 2.087083 to the left, agree=0.843, adj=0.012, (0 split)
Node number 2: 868 observations, complexity param=0.01918465
predicted class=0 expected loss=0.07258065 P(node) =0.8410853
class counts: 805 63
probabilities: 0.927 0.073
left son=4 (694 obs) right son=5 (174 obs)
Primary splits:
acidez_volatil < -0.7552291 to the right, improve=11.571490, (0 missing)
sulfatos < 0.3591132 to the left, improve= 8.193247, (0 missing)
grau_alcolico < 0.01161628 to the left, improve= 6.779079, (0 missing)
acido_citrico < 0.01241791 to the left, improve= 6.241852, (0 missing)
cloretos < -0.623591 to the right, improve= 4.745422, (0 missing)
Surrogate splits:
acido_citrico < 0.8313204 to the left, agree=0.804, adj=0.023, (0 split)
acucar_residual < 2.637203 to the left, agree=0.802, adj=0.011, (0 split)
fsd < 2.063933 to the left, agree=0.802, adj=0.011, (0 split)
PH < -2.202895 to the right, agree=0.802, adj=0.011, (0 split)
sulfatos < 2.418451 to the left, agree=0.802, adj=0.011, (0 split)
Node number 3: 164 observations, complexity param=0.1007194
predicted class=0 expected loss=0.4634146 P(node) =0.1589147
class counts: 88 76
probabilities: 0.537 0.463
left son=6 (82 obs) right son=7 (82 obs)
Primary splits:
sulfatos < 0.424181 to the left, improve=14.097560, (0 missing)
acidez_fixa < -0.1285656 to the left, improve= 7.866123, (0 missing)
PH < 0.3828312 to the right, improve= 7.527143, (0 missing)
acido_citrico < 0.2171435 to the left, improve= 7.527143, (0 missing)
acidez_volatil < -0.126957 to the right, improve= 5.504315, (0 missing)
Surrogate splits:
acido_citrico < 0.06359931 to the left, agree=0.646, adj=0.293, (0 split)
acidez_fixa < -0.6272436 to the left, agree=0.640, adj=0.280, (0 split)
densidade < -1.432767 to the left, agree=0.610, adj=0.220, (0 split)
tsd < -1.410368 to the left, agree=0.591, adj=0.183, (0 split)
fsd < 0.371857 to the left, agree=0.579, adj=0.159, (0 split)
Node number 4: 694 observations
predicted class=0 expected loss=0.03170029 P(node) =0.6724806
class counts: 672 22
probabilities: 0.968 0.032
Node number 5: 174 observations, complexity param=0.01918465
predicted class=0 expected loss=0.2356322 P(node) =0.1686047
class counts: 133 41
probabilities: 0.764 0.236
left son=10 (110 obs) right son=11 (64 obs)
Primary splits:
grau_alcolico < 0.2741428 to the left, improve=5.894070, (0 missing)
cloretos < -0.623591 to the right, improve=5.078161, (0 missing)
tsd < 0.4165548 to the right, improve=4.833333, (0 missing)
densidade < -1.004914 to the right, improve=4.789272, (0 missing)
sulfatos < 0.4872838 to the left, improve=4.490395, (0 missing)
Surrogate splits:
densidade < -0.2464966 to the right, agree=0.759, adj=0.344, (0 split)
tsd < -1.764199 to the right, agree=0.678, adj=0.125, (0 split)
acido_citrico < 1.803767 to the left, agree=0.649, adj=0.047, (0 split)
fsd < -1.90854 to the right, agree=0.644, adj=0.031, (0 split)
acucar_residual < 1.737718 to the left, agree=0.638, adj=0.016, (0 split)
Node number 6: 82 observations, complexity param=0.02158273
predicted class=0 expected loss=0.2560976 P(node) =0.07945736
class counts: 61 21
probabilities: 0.744 0.256
left son=12 (55 obs) right son=13 (27 obs)
Primary splits:
acido_citrico < 0.8825018 to the left, improve=5.544239, (0 missing)
acidez_fixa < 0.1256083 to the left, improve=4.746402, (0 missing)
PH < -0.2021667 to the right, improve=4.746402, (0 missing)
tsd < -1.215976 to the right, improve=4.511404, (0 missing)
cloretos < 0.3850831 to the left, improve=3.732539, (0 missing)
Surrogate splits:
acidez_fixa < 0.5791973 to the left, agree=0.902, adj=0.704, (0 split)
PH < -0.2021667 to the right, agree=0.866, adj=0.593, (0 split)
densidade < -0.5807761 to the left, agree=0.817, adj=0.444, (0 split)
acidez_volatil < -0.7552291 to the right, agree=0.756, adj=0.259, (0 split)
cloretos < -0.2402179 to the left, agree=0.756, adj=0.259, (0 split)
Node number 7: 82 observations, complexity param=0.05035971
predicted class=1 expected loss=0.3292683 P(node) =0.07945736
class counts: 27 55
probabilities: 0.329 0.671
left son=14 (25 obs) right son=15 (57 obs)
Primary splits:
fsd < 0.5391907 to the right, improve=6.945126, (0 missing)
grau_alcolico < 1.816099 to the left, improve=3.483248, (0 missing)
tsd < 0.2507296 to the right, improve=2.368370, (0 missing)
densidade < -0.7400479 to the right, improve=1.975493, (0 missing)
acucar_residual < -0.0888936 to the left, improve=1.550200, (0 missing)
Surrogate splits:
tsd < 0.1687793 to the right, agree=0.854, adj=0.52, (0 split)
grau_alcolico < 1.079215 to the left, agree=0.744, adj=0.16, (0 split)
acidez_volatil < -1.914234 to the left, agree=0.707, adj=0.04, (0 split)
densidade < 1.604725 to the right, agree=0.707, adj=0.04, (0 split)
Node number 10: 110 observations
predicted class=0 expected loss=0.1363636 P(node) =0.1065891
class counts: 95 15
probabilities: 0.864 0.136
Node number 11: 64 observations, complexity param=0.01918465
predicted class=0 expected loss=0.40625 P(node) =0.0620155
class counts: 38 26
probabilities: 0.594 0.406
left son=22 (36 obs) right son=23 (28 obs)
Primary splits:
PH < -0.2681564 to the right, improve=5.573413, (0 missing)
densidade < -1.004914 to the right, improve=4.017857, (0 missing)
cloretos < -0.01721581 to the right, improve=3.490385, (0 missing)
tsd < 0.4304702 to the right, improve=3.375000, (0 missing)
fsd < 0.6161762 to the right, improve=2.910437, (0 missing)
Surrogate splits:
acidez_fixa < 0.3885853 to the left, agree=0.797, adj=0.536, (0 split)
tsd < -0.3109926 to the right, agree=0.797, adj=0.536, (0 split)
densidade < 0.3584663 to the left, agree=0.719, adj=0.357, (0 split)
fsd < 0.280402 to the right, agree=0.719, adj=0.357, (0 split)
grau_alcolico < 0.4508009 to the right, agree=0.656, adj=0.214, (0 split)
Node number 12: 55 observations
predicted class=0 expected loss=0.1272727 P(node) =0.05329457
class counts: 48 7
probabilities: 0.873 0.127
Node number 13: 27 observations, complexity param=0.02158273
predicted class=1 expected loss=0.4814815 P(node) =0.02616279
class counts: 13 14
probabilities: 0.481 0.519
left son=26 (17 obs) right son=27 (10 obs)
Primary splits:
tsd < -1.173375 to the right, improve=2.516776, (0 missing)
densidade < -0.8400237 to the right, improve=2.167196, (0 missing)
grau_alcolico < 1.816099 to the right, improve=1.639376, (0 missing)
acidez_fixa < 1.107517 to the right, improve=1.516776, (0 missing)
acido_citrico < 1.445497 to the right, improve=1.516776, (0 missing)
Surrogate splits:
acido_citrico < 1.087227 to the right, agree=0.889, adj=0.7, (0 split)
cloretos < 0.4526027 to the left, agree=0.815, adj=0.5, (0 split)
fsd < -0.9931628 to the right, agree=0.815, adj=0.5, (0 split)
acidez_volatil < -0.8241137 to the left, agree=0.741, adj=0.3, (0 split)
acucar_residual < -0.0888936 to the right, agree=0.704, adj=0.2, (0 split)
Node number 14: 25 observations
predicted class=0 expected loss=0.36 P(node) =0.02422481
class counts: 16 9
probabilities: 0.640 0.360
Node number 15: 57 observations
predicted class=1 expected loss=0.1929825 P(node) =0.05523256
class counts: 11 46
probabilities: 0.193 0.807
Node number 22: 36 observations, complexity param=0.01438849
predicted class=0 expected loss=0.2222222 P(node) =0.03488372
class counts: 28 8
probabilities: 0.778 0.222
left son=44 (28 obs) right son=45 (8 obs)
Primary splits:
PH < 0.5743585 to the left, improve=3.337302, (0 missing)
acido_citrico < 0.9848646 to the right, improve=2.009662, (0 missing)
cloretos < -0.1937185 to the right, improve=2.000000, (0 missing)
acidez_volatil < -1.038808 to the right, improve=1.469444, (0 missing)
densidade < -0.702244 to the right, improve=1.185185, (0 missing)
Surrogate splits:
acido_citrico < 0.1147807 to the right, agree=0.806, adj=0.125, (0 split)
cloretos < -1.333856 to the right, agree=0.806, adj=0.125, (0 split)
fsd < 1.666146 to the left, agree=0.806, adj=0.125, (0 split)
Node number 23: 28 observations
predicted class=1 expected loss=0.3571429 P(node) =0.02713178
class counts: 10 18
probabilities: 0.357 0.643
Node number 26: 17 observations
predicted class=0 expected loss=0.3529412 P(node) =0.01647287
class counts: 11 6
probabilities: 0.647 0.353
Node number 27: 10 observations
predicted class=1 expected loss=0.2 P(node) =0.009689922
class counts: 2 8
probabilities: 0.200 0.800
Node number 44: 28 observations
predicted class=0 expected loss=0.1071429 P(node) =0.02713178
class counts: 25 3
probabilities: 0.893 0.107
Node number 45: 8 observations
predicted class=1 expected loss=0.375 P(node) =0.007751938
class counts: 3 5
probabilities: 0.375 0.625
Análise da Qualidade do Modelo
DT_Preditor <- as.data.frame(predict(DT_Modelo01, newdata = df_vinho_tinto_teste))
DT_Preditor$factor <- as.factor(ifelse(DT_Preditor[["1"]] > DT_Preditor[["0"]],1,0))
confusionMatrix(DT_Preditor$factor, df_vinho_tinto_teste$GrupoQualidade)Confusion Matrix and Statistics
Reference
Prediction 0 1
0 216 28
1 8 7
Accuracy : 0.861
95% CI : (0.8128, 0.9007)
No Information Rate : 0.8649
P-Value [Acc > NIR] : 0.615236
Kappa : 0.2165
Mcnemar's Test P-Value : 0.001542
Sensitivity : 0.9643
Specificity : 0.2000
Pos Pred Value : 0.8852
Neg Pred Value : 0.4667
Prevalence : 0.8649
Detection Rate : 0.8340
Detection Prevalence : 0.9421
Balanced Accuracy : 0.5821
'Positive' Class : 0
Até agora notamos que este foi o modelo que mais acertou com 86% de acurácia, justamente por que a técnica é capaz de prever com maior exatidao quais as variaveis mais importantes para determinar a qualidade.
Vinho Branco
DT_Modelo01 <-rpart(GrupoQualidade ~ acidez_fixa+acidez_volatil+acido_citrico+acucar_residual+cloretos+densidade+fsd+grau_alcolico+PH+sulfatos+tsd, data = df_base_branco)
summary(DT_Modelo01)Call:
rpart(formula = GrupoQualidade ~ acidez_fixa + acidez_volatil +
acido_citrico + acucar_residual + cloretos + densidade +
fsd + grau_alcolico + PH + sulfatos + tsd, data = df_base_branco)
n= 3943
CP nsplit rel error xerror xstd
1 0.04323995 0 1.0000000 1.0000000 0.03105500
2 0.01461632 2 0.9135201 0.9403167 0.03034941
3 0.01096224 3 0.8989038 0.9317905 0.03024483
4 0.01000000 5 0.8769793 0.9427527 0.03037911
Variable importance
grau_alcolico densidade cloretos tsd acucar_residual sulfatos fsd acidez_fixa
44 26 14 7 4 2 2 1
Node number 1: 3943 observations, complexity param=0.04323995
predicted class=0 expected loss=0.2082171 P(node) =1
class counts: 3122 821
probabilities: 0.792 0.208
left son=2 (2421 obs) right son=3 (1522 obs)
Primary splits:
grau_alcolico < 10.85 to the left, improve=180.10410, (0 missing)
densidade < 0.99181 to the right, improve=138.13450, (0 missing)
cloretos < 0.0395 to the right, improve= 98.30691, (0 missing)
tsd < 153.5 to the right, improve= 55.31960, (0 missing)
acucar_residual < 6.15 to the right, improve= 32.35121, (0 missing)
Surrogate splits:
densidade < 0.992005 to the right, agree=0.863, adj=0.645, (0 split)
cloretos < 0.0375 to the right, agree=0.743, adj=0.334, (0 split)
tsd < 114.5 to the right, agree=0.683, adj=0.180, (0 split)
acucar_residual < 5.05 to the right, agree=0.648, adj=0.088, (0 split)
sulfatos < 0.375 to the right, agree=0.631, adj=0.045, (0 split)
Node number 2: 2421 observations
predicted class=0 expected loss=0.08839323 P(node) =0.6139995
class counts: 2207 214
probabilities: 0.912 0.088
Node number 3: 1522 observations, complexity param=0.04323995
predicted class=0 expected loss=0.3988173 P(node) =0.3860005
class counts: 915 607
probabilities: 0.601 0.399
left son=6 (1219 obs) right son=7 (303 obs)
Primary splits:
grau_alcolico < 12.55 to the left, improve=36.07178, (0 missing)
fsd < 11.5 to the left, improve=16.41962, (0 missing)
cloretos < 0.0395 to the right, improve=15.20868, (0 missing)
PH < 3.065 to the left, improve=13.54398, (0 missing)
acucar_residual < 2.05 to the left, improve=13.10818, (0 missing)
Surrogate splits:
densidade < 0.989595 to the right, agree=0.840, adj=0.195, (0 split)
acidez_volatil < 0.595 to the left, agree=0.804, adj=0.013, (0 split)
sulfatos < 0.275 to the right, agree=0.803, adj=0.010, (0 split)
tsd < 21.5 to the right, agree=0.803, adj=0.010, (0 split)
acidez_fixa < 4.75 to the right, agree=0.802, adj=0.003, (0 split)
Node number 6: 1219 observations
predicted class=0 expected loss=0.3445447 P(node) =0.3091555
class counts: 799 420
probabilities: 0.655 0.345
Node number 7: 303 observations, complexity param=0.01461632
predicted class=1 expected loss=0.3828383 P(node) =0.07684504
class counts: 116 187
probabilities: 0.383 0.617
left son=14 (14 obs) right son=15 (289 obs)
Primary splits:
cloretos < 0.0495 to the right, improve=8.743060, (0 missing)
fsd < 21.5 to the left, improve=8.341580, (0 missing)
tsd < 80.5 to the left, improve=4.984619, (0 missing)
acidez_volatil < 0.59 to the right, improve=4.055789, (0 missing)
PH < 3.385 to the left, improve=3.265254, (0 missing)
Node number 14: 14 observations
predicted class=0 expected loss=0.07142857 P(node) =0.003550596
class counts: 13 1
probabilities: 0.929 0.071
Node number 15: 289 observations, complexity param=0.01096224
predicted class=1 expected loss=0.3564014 P(node) =0.07329445
class counts: 103 186
probabilities: 0.356 0.644
left son=30 (83 obs) right son=31 (206 obs)
Primary splits:
fsd < 20.5 to the left, improve=8.036690, (0 missing)
tsd < 72.5 to the left, improve=5.800931, (0 missing)
acidez_volatil < 0.59 to the right, improve=4.639843, (0 missing)
PH < 3.385 to the left, improve=2.583294, (0 missing)
sulfatos < 0.305 to the right, improve=2.126465, (0 missing)
Surrogate splits:
tsd < 89 to the left, agree=0.796, adj=0.289, (0 split)
sulfatos < 0.68 to the right, agree=0.737, adj=0.084, (0 split)
acidez_volatil < 0.63 to the right, agree=0.723, adj=0.036, (0 split)
acucar_residual < 1.05 to the left, agree=0.720, adj=0.024, (0 split)
densidade < 0.993165 to the right, agree=0.720, adj=0.024, (0 split)
Node number 30: 83 observations, complexity param=0.01096224
predicted class=0 expected loss=0.4578313 P(node) =0.02104996
class counts: 45 38
probabilities: 0.542 0.458
left son=60 (42 obs) right son=61 (41 obs)
Primary splits:
acidez_fixa < 6.35 to the right, improve=5.037572, (0 missing)
fsd < 8.5 to the left, improve=3.934866, (0 missing)
grau_alcolico < 13.25 to the left, improve=3.213366, (0 missing)
densidade < 0.98989 to the right, improve=3.121098, (0 missing)
sulfatos < 0.325 to the right, improve=2.437902, (0 missing)
Surrogate splits:
densidade < 0.98961 to the right, agree=0.747, adj=0.488, (0 split)
acucar_residual < 3.25 to the right, agree=0.687, adj=0.366, (0 split)
PH < 3.265 to the left, agree=0.687, adj=0.366, (0 split)
grau_alcolico < 13.25 to the left, agree=0.627, adj=0.244, (0 split)
acido_citrico < 0.235 to the right, agree=0.602, adj=0.195, (0 split)
Node number 31: 206 observations
predicted class=1 expected loss=0.2815534 P(node) =0.05224448
class counts: 58 148
probabilities: 0.282 0.718
Node number 60: 42 observations
predicted class=0 expected loss=0.2857143 P(node) =0.01065179
class counts: 30 12
probabilities: 0.714 0.286
Node number 61: 41 observations
predicted class=1 expected loss=0.3658537 P(node) =0.01039817
class counts: 15 26
probabilities: 0.366 0.634
DT_Preditor <- as.data.frame(predict(DT_Modelo01, newdata = df_vinho_branco_teste))
DT_Preditor$factor <- as.factor(ifelse(DT_Preditor[["1"]] > DT_Preditor[["0"]],1,0))
confusionMatrix(DT_Preditor$factor, df_vinho_branco_teste$GrupoQualidade)Confusion Matrix and Statistics
Reference
Prediction 0 1
0 583 159
1 0 0
Accuracy : 0.7857
95% CI : (0.7544, 0.8147)
No Information Rate : 0.7857
P-Value [Acc > NIR] : 0.5212
Kappa : 0
Mcnemar's Test P-Value : <2e-16
Sensitivity : 1.0000
Specificity : 0.0000
Pos Pred Value : 0.7857
Neg Pred Value : NaN
Prevalence : 0.7857
Detection Rate : 0.7857
Detection Prevalence : 1.0000
Balanced Accuracy : 0.5000
'Positive' Class : 0
notamos que acertamos em 77% dos casos
Modelo 4: Regressão Logística
Técnica
A regressão logística é um modelo no qual classificamos na qual a variável dependente possuem valores binários (intervalos entre 0 e 1), ou seja, um ou o outro e as independentes podem ser categóricas ou não.
Este tipo de modelo lida muito bem com variáveis de entrada (independentes) de tipo categórica e possui um grau relativamente alto de confiabilidade.
Podemos dizer de modo geral que funciona como uma regressão linear, com exceção de que as variáveis dependentes devem ser categóricas e utiliza o método de máxima verossimilhança, ao invés dos mínimos quadrados como na regressão linear.
Como vimos, nosso dataset possui apenas dados numéricos, com exceção do tipo de vinho.
Criando modelo Árvore de Regressão Logística com todas as variáveis (quality: variável principal)
Vinho Tinto
RL_Modelo01 <- glm(qualidade ~ acidez_fixa+acidez_volatil+acido_citrico+acucar_residual+cloretos+densidade+fsd+grau_alcolico+PH+sulfatos+tsd, data = df_vinho_tinto_treino)
summary(RL_Modelo01)
Call:
glm(formula = qualidade ~ acidez_fixa + acidez_volatil + acido_citrico +
acucar_residual + cloretos + densidade + fsd + grau_alcolico +
PH + sulfatos + tsd, data = df_vinho_tinto_treino)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.91779 -0.42534 -0.02276 0.54255 2.23170
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.0005926 0.0240603 -0.025 0.9804
acidez_fixa 0.0989973 0.0644249 1.537 0.1247
acidez_volatil -0.2529691 0.0340139 -7.437 2.18e-13 ***
acido_citrico -0.0813844 0.0420323 -1.936 0.0531 .
acucar_residual 0.0337355 0.0340020 0.992 0.3214
cloretos -0.0292052 0.0330493 -0.884 0.3771
densidade -0.0807869 0.0650825 -1.241 0.2148
fsd 0.0604981 0.0432092 1.400 0.1618
grau_alcolico 0.3809766 0.0474714 8.025 2.77e-15 ***
PH -0.0952265 0.0457608 -2.081 0.0377 *
sulfatos 0.2302949 0.0296359 7.771 1.90e-14 ***
tsd -0.0877090 0.0452497 -1.938 0.0529 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for gaussian family taken to be 0.5907833)
Null deviance: 1001.6 on 1031 degrees of freedom
Residual deviance: 602.6 on 1020 degrees of freedom
AIC: 2399.5
Number of Fisher Scoring iterations: 2
RL_Preditor <- predict.glm(RL_Modelo01, newdata = df_vinho_tinto_teste, type = 'response')
RL_Preditor_Corte <- as.factor(ifelse(RL_Preditor > 6,1,0))
confusionMatrix(RL_Preditor_Corte, df_vinho_tinto_teste$GrupoQualidade)Confusion Matrix and Statistics
Reference
Prediction 0 1
0 224 35
1 0 0
Accuracy : 0.8649
95% CI : (0.8171, 0.904)
No Information Rate : 0.8649
P-Value [Acc > NIR] : 0.5449
Kappa : 0
Mcnemar's Test P-Value : 9.081e-09
Sensitivity : 1.0000
Specificity : 0.0000
Pos Pred Value : 0.8649
Neg Pred Value : NaN
Prevalence : 0.8649
Detection Rate : 0.8649
Detection Prevalence : 1.0000
Balanced Accuracy : 0.5000
'Positive' Class : 0
86% adicionar texto explicativo
Vinho Branco
RL_Modelo01 <- glm(qualidade ~ acidez_fixa+acidez_volatil+acido_citrico+acucar_residual+cloretos+densidade+fsd+grau_alcolico+PH+sulfatos+tsd, data = df_vinho_branco_treino)
summary(RL_Modelo01)
Call:
glm(formula = qualidade ~ acidez_fixa + acidez_volatil + acido_citrico +
acucar_residual + cloretos + densidade + fsd + grau_alcolico +
PH + sulfatos + tsd, data = df_vinho_branco_treino)
Deviance Residuals:
Min 1Q Median 3Q Max
-3.7158 -0.5311 -0.0277 0.5226 3.4384
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.008325 0.015059 0.553 0.58045
acidez_fixa 0.068133 0.023397 2.912 0.00362 **
acidez_volatil -0.150709 0.016759 -8.993 < 2e-16 ***
acido_citrico 0.053721 0.018986 2.829 0.00469 **
acucar_residual 0.344473 0.036732 9.378 < 2e-16 ***
cloretos -0.109751 0.020807 -5.275 1.43e-07 ***
densidade -0.440484 0.061300 -7.186 8.43e-13 ***
fsd 0.186139 0.021158 8.797 < 2e-16 ***
grau_alcolico 0.212618 0.039284 5.412 6.72e-08 ***
PH 0.138252 0.020761 6.659 3.27e-11 ***
sulfatos 0.080651 0.016046 5.026 5.30e-07 ***
tsd -0.062914 0.024020 -2.619 0.00886 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for gaussian family taken to be 0.6668441)
Null deviance: 2869.4 on 2965 degrees of freedom
Residual deviance: 1969.9 on 2954 degrees of freedom
AIC: 7229.3
Number of Fisher Scoring iterations: 2
RL_Preditor <- predict.glm(RL_Modelo01, newdata = df_vinho_branco_teste, type = 'response')
RL_Preditor_Corte <- as.factor(ifelse(RL_Preditor > 6,1,0))
confusionMatrix(RL_Preditor_Corte, df_vinho_branco_teste$GrupoQualidade)Confusion Matrix and Statistics
Reference
Prediction 0 1
0 583 159
1 0 0
Accuracy : 0.7857
95% CI : (0.7544, 0.8147)
No Information Rate : 0.7857
P-Value [Acc > NIR] : 0.5212
Kappa : 0
Mcnemar's Test P-Value : <2e-16
Sensitivity : 1.0000
Specificity : 0.0000
Pos Pred Value : 0.7857
Neg Pred Value : NaN
Prevalence : 0.7857
Detection Rate : 0.7857
Detection Prevalence : 1.0000
Balanced Accuracy : 0.5000
'Positive' Class : 0
78%
PCA
adicionar algo sobre o pca
Vinho Tinto
Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 PC12
Standard deviation 1.7669 1.4852 1.2898 1.1185 0.98442 0.80767 0.78325 0.72387 0.63491 0.57640 0.43721 0.2683
Proportion of Variance 0.2602 0.1838 0.1386 0.1043 0.08076 0.05436 0.05112 0.04367 0.03359 0.02769 0.01593 0.0060
Cumulative Proportion 0.2602 0.4440 0.5826 0.6869 0.76764 0.82200 0.87313 0.91679 0.95038 0.97807 0.99400 1.0000
plot(1:12, TintoPCA$sdev^2, type = "b", xlab = "Componente",
ylab = "Variância", pch = 20, cex.axis = 0.8, cex.lab = 0.8)Vinho Branco
Importance of components:
PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 PC12
Standard deviation 1.8309 1.2696 1.1724 1.04334 0.99212 0.96539 0.8743 0.83039 0.74504 0.59230 0.52930 0.12790
Proportion of Variance 0.2794 0.1343 0.1145 0.09071 0.08202 0.07766 0.0637 0.05746 0.04626 0.02923 0.02335 0.00136
Cumulative Proportion 0.2794 0.4137 0.5282 0.61895 0.70097 0.77864 0.8423 0.89980 0.94606 0.97529 0.99864 1.00000
plot(1:12, BrancoPCA$sdev^2, type = "b", xlab = "Componente",
ylab = "Variância", pch = 20, cex.axis = 0.8, cex.lab = 0.8)